"""
定时抓取历史数据模块
"""
import threading
import time
from datetime import datetime
import traceback
from .fetch_task_history_data import TaskHistoryDataFetcher
from com.utils.logger import get_logger

logger = get_logger("ScheduledHistoryDataFetcher")

class ScheduledHistoryDataFetcher:
    """定时抓取历史数据类"""
    
    def __init__(self, interval_hours=2):
        """
        初始化
        
        Args:
            interval_hours: 定时间隔小时数，默认2小时
        """
        self.interval_hours = interval_hours
        self.running = False
        self.thread = None
        self.fetcher = TaskHistoryDataFetcher()
    
    def _worker(self):
        """工作线程函数"""
        logger.info(f"历史数据定时抓取已启动，间隔时间为 {self.interval_hours} 小时")
        
        while self.running:
            try:
                # 计算下次运行时间
                next_run_time = time.time() + self.interval_hours * 3600
                next_run_datetime = datetime.fromtimestamp(next_run_time)
                logger.info(f"下次历史数据抓取将在 {next_run_datetime.strftime('%Y-%m-%d %H:%M:%S')} 进行")
                
                # 等待到下次运行时间
                while self.running and time.time() < next_run_time:
                    time.sleep(10)  # 每10秒检查一次是否需要退出
                
                # 如果仍在运行，则执行抓取任务
                if self.running:
                    logger.info("开始执行定时历史数据抓取...")
                    self.fetcher.run()
                    logger.info("定时历史数据抓取完成")
            except Exception as e:
                logger.error(f"定时历史数据抓取发生错误: {str(e)}")
                traceback.print_exc()
                # 出错后等待10分钟再继续
                time.sleep(600)
    
    def start(self):
        """启动定时抓取"""
        if not self.running:
            self.running = True
            self.thread = threading.Thread(target=self._worker, daemon=True)
            self.thread.start()
            logger.info("历史数据定时抓取服务已启动")
        else:
            logger.warning("历史数据定时抓取服务已在运行中")
    
    def stop(self):
        """停止定时抓取"""
        if self.running:
            self.running = False
            if self.thread and self.thread.is_alive():
                self.thread.join(timeout=1.0)  # 等待线程结束，最多等待1秒
            logger.info("历史数据定时抓取服务已停止")
        else:
            logger.warning("历史数据定时抓取服务未在运行")
    
    def is_running(self):
        """
        检查是否正在运行
        
        Returns:
            bool: 是否正在运行
        """
        return self.running and self.thread and self.thread.is_alive()
